import array
from pprint import pprint

"""
容器序列: 存放对象的引用
    list、tuple 和 collections.deque 这些序列能存放不同类型的数据

扁平序列: 存放值
    str、bytes、bytearray、memoryview 和 array.array，这类序列只能容纳一种类型
"""

"""
可变序列:
    list、bytearray、array.array、collections.deque 和 memoryview

不可变序列:
    tuple、str 和 bytes
"""

# ord()函数 返回字符的ASCII码或者Unicode数值
symbols = '@#$%^&*'
codes = [ord(symbol) for symbol in symbols]     # 列表推导式
print('codes: {}'.format(codes))

# 列表推导式不会再有变量泄露的问题
x = 'my list'
list_x = [x for x in 'ABC']
print('x: %s' % x)
print('list_x: {}'.format(list_x))

# 列表推导式同filter、map的比较
beyond_ascii = [ord(s) for s in symbols if ord(s) > 60]
print(beyond_ascii)
beyond_ascii = list(filter(lambda c: c > 60, map(ord, symbols)))
print(beyond_ascii)

# 笛卡儿积
'''
        1       2       3
A       A1      A2      A3
B       B1      B2      B3
C       C1      C2      C3        
笛卡儿积是一个列表，列表里的元素是由输入的可迭代类型的元素对构成的元组，因此笛卡儿积列表的长度等于输入变量的长度的乘积
'''
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
t_shirts = [(color, size) for color in colors for size in sizes]
pprint(t_shirts)

# 生成器表达式
t = tuple(ord(symbol) for symbol in symbols)    # 使用生成器初始化元组
print('tuple: {}'.format(t))
arr = array.array('I', (ord(symbol) for symbol in symbols)) # 使用生成器初始化数组
print('array: {}'.format(arr))

# 使用生成器计算笛卡尔积
print('生成器-笛卡尔积:')
for t_shirt in ('%s %s' % (color, size) for color in colors for size in sizes):
    print(t_shirt)